/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.datamodel.LazyEmpreendimento;
import br.jm.financeiro.datamodel.LazySelectedEmpreendimento;
import br.jm.financeiro.datamodel.LazySelectedEmpreendimentoLote;
import br.jm.financeiro.entity.Assunto;
import br.jm.financeiro.entity.CepEndereco;
import br.jm.financeiro.entity.Cliente;
import br.jm.financeiro.entity.Diagnostico;
import br.jm.financeiro.entity.Empreendimento;
import br.jm.financeiro.entity.EmpreendimentoEndereco;
import br.jm.financeiro.entity.EmpreendimentoLote;
import br.jm.financeiro.entity.ProcessoDiagnosticoNivel1;
import br.jm.financeiro.entity.Usuario;
import br.jm.financeiro.filter.Funcoes;
import br.jm.financeiro.sistema.eao.EmpreendimentoEao;
import br.jm.financeiro.sistema.eao.EmpreendimentoLoteEao;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class EmpreendimentoBean implements Serializable {

    private static final long serialVersionUID = 3833578083233874447L;

    private FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Processo Iniciado com Sucesso", " ");
    private Empreendimento selectedEmpreendimento;
    private EmpreendimentoEndereco selectedEmpreendimentoEndereco;
    private EmpreendimentoLote selectedEmpreendimentoLote;
    private CepEndereco selectedCepEndereco;
    private ProcessoDiagnosticoNivel1 selectedProcessoDiagnosticoNivel1;
    private EmpreendimentoEao empreendimentoJpa;
    private EmpreendimentoLoteEao empreendimentoLoteJpa;
    private LazyDataModel<Empreendimento> empreendimentoLazyModel;
    private Integer rowid;
    private Funcoes funcoes = new Funcoes();
    private boolean enderecoField = true;
    private boolean lReturn = true;
    private boolean mostradmin;
    private FacesContext ctx;
    private HttpSession session;
    private int rowidclienteempreendimento;
    private Diagnostico selectedDiagnostico;
    private boolean incluir;
    private int rowidEndereco;
    private boolean incluirprocesso;
    private EmpreendimentoLote[] empreendimentoLoteTransferencia;
    private Empreendimento empreendimentoTransferencia;
    private LazySelectedEmpreendimentoLote lazyEmpreendimentoLoteTransferencia;
    private LazySelectedEmpreendimento lazyEmpreendimentoTransferencia;
    private List<EmpreendimentoLote> listEmpreendimentoLote;
    private String cFiltro;

    public EmpreendimentoBean() throws EaoException {
        ctx = FacesContext.getCurrentInstance();
        session = (HttpSession) ctx.getExternalContext().getSession(false);

        this.listEmpreendimentoLote = new ArrayList<>();
        this.selectedEmpreendimento = new Empreendimento();
        this.selectedEmpreendimento.setEmpreendimentoLoteList(listEmpreendimentoLote);
        this.selectedEmpreendimentoEndereco = new EmpreendimentoEndereco();
        this.selectedEmpreendimentoEndereco.setCodLogradouro(new CepEndereco());
        this.selectedEmpreendimentoLote = new EmpreendimentoLote();
        this.selectedEmpreendimentoLote.setTipPrioridadeLote("N");
        this.selectedEmpreendimentoLote.setStatus("A");
        this.selectedEmpreendimentoLote.setTipStatus("T");
        this.selectedEmpreendimentoLote.setTipStatusSinal("A");
        this.selectedEmpreendimentoLote.setIdAssunto(new Assunto());
        this.selectedCepEndereco = new CepEndereco();
        this.selectedProcessoDiagnosticoNivel1 = new ProcessoDiagnosticoNivel1();

        empreendimentoJpa = EmpreendimentoEao.getInstance();
        empreendimentoLoteJpa = EmpreendimentoLoteEao.getInstance();

        session.setAttribute("status_empreendimento", "A");
        session.removeAttribute("filtroSinal");
        session.removeAttribute("processo_empreendimento");
        empreendimentoLazyModel = new LazyEmpreendimento(empreendimentoJpa);

        cFiltro = " empreendimento.sta_empreendimento = 'A' AND cliente.sta_cliente = 'A' ";

        lazyEmpreendimentoLoteTransferencia = new LazySelectedEmpreendimentoLote(this.selectedEmpreendimento.getEmpreendimentoLoteList());
        lazyEmpreendimentoTransferencia = new LazySelectedEmpreendimento(empreendimentoJpa.getNative("Empreendimento", 0, empreendimentoJpa.getCount("Empreendimento"), null, true, null, null, cFiltro));

        this.mostradmin = false;

        try {
            Usuario user = (Usuario) session.getAttribute("usuarioAutenticado");

            if (user != null) {
                if (user.getTipUsuario().equals("Administrador")) {
                    this.mostradmin = true;
                }
            }
        } catch (Exception e) {
            e.getMessage();
        }
    }

    public Empreendimento getSelectedEmpreendimento() {
        return selectedEmpreendimento;
    }

    public void setSelectedEmpreendimento(Empreendimento selectedEmpreendimento) throws EaoException {
        this.selectedEmpreendimentoEndereco = new EmpreendimentoEndereco();
        this.selectedEmpreendimentoEndereco.setCodLogradouro(new CepEndereco());
        this.selectedEmpreendimentoLote = new EmpreendimentoLote();
        this.selectedEmpreendimentoLote.setTipPrioridadeLote("N");
        this.selectedEmpreendimentoLote.setStatus("A");
        this.selectedEmpreendimentoLote.setTipStatus("T");
        this.selectedEmpreendimentoLote.setTipStatusSinal("A");
        this.selectedEmpreendimentoLote.setDatUpdateLote(new Date());
        this.selectedEmpreendimentoLote.setIdAssunto(new Assunto());
        this.enderecoField = true;

        if (selectedEmpreendimento.getEmpreendimentoEnderecoList().isEmpty()) {
            selectedEmpreendimento.setEmpreendimentoEnderecoList(new ArrayList<EmpreendimentoEndereco>());
        } else {
            this.selectedEmpreendimentoEndereco = selectedEmpreendimento.getEmpreendimentoEnderecoList().get(0);
        }
        listEmpreendimentoLote = selectedEmpreendimento.getEmpreendimentoLoteList();
        this.lazyEmpreendimentoLoteTransferencia = new LazySelectedEmpreendimentoLote(listEmpreendimentoLote);

        this.selectedEmpreendimento = selectedEmpreendimento;
    }

    public EmpreendimentoLote getSelectedEmpreendimentoLote() {
        return selectedEmpreendimentoLote;
    }

    public void setSelectedEmpreendimentoLote(EmpreendimentoLote selectedEmpreendimentoLote) throws IOException {
        if (selectedEmpreendimentoLote == null) {
            selectedEmpreendimentoLote = new EmpreendimentoLote();
            selectedEmpreendimentoLote.setTipPrioridadeLote("N");
            selectedEmpreendimentoLote.setStatus("A");
            selectedEmpreendimentoLote.setTipStatus("T");
            selectedEmpreendimentoLote.setTipStatusSinal("A");
            selectedEmpreendimentoLote.setDatUpdateLote(new Date());
        }
        if (selectedEmpreendimentoLote.getDscDiagnostico() == null || selectedEmpreendimentoLote.getDscDiagnostico().equals("null")) {
            selectedEmpreendimentoLote.setDscDiagnostico("");
        }
        if (selectedEmpreendimentoLote.getIdAssunto() == null) {
            selectedEmpreendimentoLote.setIdAssunto(new Assunto());
        }
        this.selectedEmpreendimentoLote = selectedEmpreendimentoLote;
    }

    public LazyDataModel<Empreendimento> getEmpreendimentoLazyModel() {
        return empreendimentoLazyModel;
    }

    public void setEmpreendimentoLazyModel(LazyDataModel<Empreendimento> empreendimentoLazyModel) {
        this.empreendimentoLazyModel = empreendimentoLazyModel;
    }
    /*
     public List<EmpreendimentoLote> getEmpreendimentoLoteList() {
     return empreendimentoLoteList;
     }

     public void setEmpreendimentoLoteList(List<EmpreendimentoLote> empreendimentoLoteList) {
     this.empreendimentoLoteList = empreendimentoLoteList;
     }

     public void onRowToggle(ToggleEvent event) throws EaoException {
     this.selectedEmpreendimento = (Empreendimento) event.getData();
     String cFiltro = " id_empreendimento = ".concat(this.selectedEmpreendimento.getIdEmpreendimento().toString());
     empreendimentoLoteList = empreendimentoLoteJpa.getNative("EmpreendimentoLote", 0, empreendimentoLoteJpa.getCount("EmpreendimentoLote"), null, false, null, null, cFiltro);
     }

     public void onRowToggleClienteEmpreendimento(ToggleEvent event) throws EaoException {
     this.selectedEmpreendimento = (Empreendimento) event.getData();
     String cFiltro = " id_empreendimento = ".concat(this.selectedEmpreendimento.getIdEmpreendimento().toString());
     empreendimentoLoteList = empreendimentoLoteJpa.getNative("EmpreendimentoLote", 0, empreendimentoLoteJpa.getCount("EmpreendimentoLote"), null, false, null, null, cFiltro);
     }
     */

    public void preparaInserir(ActionEvent actionEvent) {
        try {
            this.selectedEmpreendimento = new Empreendimento();
            this.selectedEmpreendimento.setDscEmpreendimento("");
            this.selectedEmpreendimento.setDscLote(" ");
            this.selectedEmpreendimento.setEmpColor("#ffffff");
            this.selectedEmpreendimento.setIdCliente(new Cliente());
            this.selectedEmpreendimento.setNumCpfEmpreendimento("");
            this.selectedEmpreendimento.setTipEmpreendimento("J");

            this.selectedEmpreendimentoLote = new EmpreendimentoLote();
            this.selectedEmpreendimentoLote.setTipPrioridadeLote("N");
            this.selectedEmpreendimentoLote.setStatus("A");
            this.selectedEmpreendimentoLote.setTipStatus("T");
            this.selectedEmpreendimentoLote.setTipStatusSinal("A");
            this.selectedEmpreendimentoLote.setDatUpdateLote(new Date());
            this.selectedEmpreendimentoLote.setIdAssunto(new Assunto());

            this.enderecoField = true;
            this.selectedEmpreendimentoEndereco = new EmpreendimentoEndereco();
            this.selectedEmpreendimentoEndereco.setCodLogradouro(new CepEndereco());
            this.incluir = true;
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Carregar os Dados", null);

            FacesContext.getCurrentInstance().addMessage(null, msg);
        }

    }

    public void preparaInserirProcesso(ActionEvent actionEvent) {
        this.selectedEmpreendimentoLote = new EmpreendimentoLote();
        this.selectedEmpreendimentoLote.setTipPrioridadeLote("N");
        this.selectedEmpreendimentoLote.setStatus("A");
        this.selectedEmpreendimentoLote.setTipStatus("T");
        this.selectedEmpreendimentoLote.setTipStatusSinal("A");
        this.selectedEmpreendimentoLote.setIdAssunto(new Assunto());
        this.incluirprocesso = true;
    }

    public void preparaInserirEndereco(ActionEvent actionEvent) {
        selectedEmpreendimentoEndereco = new EmpreendimentoEndereco();
        selectedEmpreendimentoEndereco.setCodLogradouro(new CepEndereco());
    }

    public void inserirEmpreendimento(ActionEvent actionEvent) {
        msg = null;
        lReturn = false;
        RequestContext context = RequestContext.getCurrentInstance();

        try {

            if (ValidaCampos("Inserir")) {
                empreendimentoJpa.create(selectedEmpreendimento);

                lReturn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Empreendimento Inserido com Sucesso: ".concat(selectedEmpreendimento.getDscEmpreendimento())), selectedEmpreendimento.getDscEmpreendimento());
            }

        } catch (IOException | EaoException e) {
            try {
                empreendimentoJpa.destroy(selectedEmpreendimento);
            } catch (Exception ex) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir Empreendimento: ".concat(selectedEmpreendimento.getDscEmpreendimento()), ex.getMessage());
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir Empreendimento: ".concat(selectedEmpreendimento.getDscEmpreendimento()), e.getMessage());
            lReturn = false;
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            context.update("frmEmpreendimento:messages");
            if (lReturn) {
                this.preparaInserir(actionEvent);

                context.update("frmEmpreendimento:empreendimentoTable");
                context.update("frmEmpreendimento:panel");
            }

            context.addCallbackParam("loggedIn", lReturn);
            this.incluir = false;
        }
    }

    public void inserirProcesso(ActionEvent actionEvent) {
        lReturn = false;
        try {
            if (verifica_processo("I")) {
                if (selectedEmpreendimento.getEmpreendimentoLoteList() == null) {
                    selectedEmpreendimento.setEmpreendimentoLoteList(new ArrayList<EmpreendimentoLote>());
                }
                if (selectedEmpreendimentoLote.getStatus() == null) {
                    selectedEmpreendimentoLote.setStatus("A");
                }
                if (selectedEmpreendimentoLote.getTipStatusSinal() == null) {
                    selectedEmpreendimentoLote.setTipStatusSinal("A");
                }
                if (selectedEmpreendimentoLote.getTipPrioridadeLote() == null) {
                    selectedEmpreendimentoLote.setTipPrioridadeLote("N");
                }

                if (this.selectedEmpreendimentoLote.getIdAssunto() == null) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Selecione o ASSUNTO!", selectedEmpreendimentoLote.getNumProcesso());
                } else {
                    selectedEmpreendimentoLote.setEmpColor("normal-row");

                    selectedEmpreendimentoLote.setDatUpdateLote(new Date());

                    //selectedEmpreendimentoLote.setDscLote(selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
                    selectedEmpreendimento.setTipPrioridade(selectedEmpreendimentoLote.getTipPrioridadeLote());
                    selectedEmpreendimentoLote.setIdEmpreendimento(selectedEmpreendimento);

                    selectedEmpreendimento.getEmpreendimentoLoteList().add(selectedEmpreendimentoLote);

                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Processo Inserido com Sucesso!", selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
                    lReturn = true;
                }
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Numero de Processo já Cadastrado: ", selectedEmpreendimentoLote.getNumProcesso());
                lReturn = false;
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir o Processo: ", selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
            lReturn = false;
        } finally {
            if (lReturn) {
                this.preparaInserirProcesso(actionEvent);
            }
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterarEmpreendimento(ActionEvent actionEvent) throws EaoException {
        msg = null;
        lReturn = false;
        String cSql;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean lPassa = false;

        try {
            if (ValidaCampos("Alterar")) {
                empreendimentoJpa.edit(selectedEmpreendimento);

                lReturn = true;

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Empreendimento Alterado com Sucesso: ".concat(selectedEmpreendimento.getDscEmpreendimento())), selectedEmpreendimento.getDscEmpreendimento());

            }

        } catch (IOException | EaoException e) {
            //empreendimentoJpa.closeSessaoRollback(sessao);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Alterar Empreendimento", selectedEmpreendimento.getDscEmpreendimento());
            lReturn = false;
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            if (lReturn) {
                this.preparaInserir(actionEvent);

                context.update("frmEmpreendimento:panel");
                context.update("frmEmpreendimento:empreendimentoTable");
            }
            context.update("frmEmpreendimento:messages");

            context.addCallbackParam("loggedIn", lReturn);
            this.incluir = false;
        }
    }

    public void efetuaTransferencia(ActionEvent actionEvent) throws EaoException, IOException {
        msg = null;
        lReturn = false;
        String cSql;
        RequestContext context = RequestContext.getCurrentInstance();
        boolean lPassa = false;
        this.listEmpreendimentoLote = new ArrayList<>();
        String cMensagem = "Transferência de Processos de: ";
        ctx = FacesContext.getCurrentInstance();

        try {
            if (this.empreendimentoLoteTransferencia.length > 0) {
                if (this.empreendimentoTransferencia != null) {
                    cMensagem += this.selectedEmpreendimento.getDscEmpreendimento().concat(" para: ").concat(this.empreendimentoTransferencia.getDscEmpreendimento()).concat(" Processos: ");
                    this.listEmpreendimentoLote = this.empreendimentoTransferencia.getEmpreendimentoLoteList();
                    for (EmpreendimentoLote empreendimentoLoteTransferencia1 : this.empreendimentoLoteTransferencia) {
                        this.selectedEmpreendimentoLote = empreendimentoLoteTransferencia1;
                        this.selectedEmpreendimentoLote.setIdEmpreendimento(this.empreendimentoTransferencia);
                        this.listEmpreendimentoLote.add(this.selectedEmpreendimentoLote);
                        cMensagem += this.selectedEmpreendimentoLote.getNumProcesso().concat(" - ");
                    }
                    this.empreendimentoTransferencia.setEmpreendimentoLoteList(listEmpreendimentoLote);
                    empreendimentoJpa.edit(this.empreendimentoTransferencia);

                    lReturn = true;

                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", cMensagem), selectedEmpreendimento.getDscEmpreendimento());
                } else {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Nenhum Empreendimento Destino foi Selecionado!", selectedEmpreendimento.getDscEmpreendimento());
                }
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Nenhum Processo foi Selecionado!", selectedEmpreendimento.getDscEmpreendimento());
            }

        } catch (EaoException e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Alterar Empreendimento", selectedEmpreendimento.getDscEmpreendimento());
            lReturn = false;
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            if (lReturn) {
                this.preparaInserir(actionEvent);
                this.empreendimentoLoteTransferencia = null;
                this.empreendimentoTransferencia = null;

                context.update("frmEmpreendimento:panel");
                context.update("frmEmpreendimento:empreendimentoTable");
                
                ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/movimentos/transferencia_processos.jsf");
            }
            context.update("frmEmpreendimento:messages");

            context.addCallbackParam("loggedIn", lReturn);
            this.incluir = false;
        }
    }

    public void alterarProcesso(ActionEvent actionEvent) {
        lReturn = false;
        try {
            if (verifica_processo("A")) {
                //empreendimentoLoteList = new ArrayList<>();
                //empreendimentoLoteList = selectedEmpreendimento.getEmpreendimentoLoteList();
                selectedEmpreendimentoLote.setDatUpdateLote(new Date());

                if (selectedEmpreendimentoLote.getTipPrioridadeLote() == null) {
                    selectedEmpreendimentoLote.setTipPrioridadeLote("N");
                }

                if (this.selectedEmpreendimentoLote.getIdAssunto() == null) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Selecione o ASSUNTO!", selectedEmpreendimentoLote.getNumProcesso());
                } else {
                    selectedEmpreendimento.setTipPrioridade(selectedEmpreendimentoLote.getTipPrioridadeLote());

                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Processo Alterado com Sucesso!", selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
                    lReturn = true;
                }
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Numero de Processo já Cadastrado: ", selectedEmpreendimentoLote.getNumProcesso());
                lReturn = false;
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Alterar o Processo: ", selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
            lReturn = false;
        } finally {
            if (lReturn) {
                this.preparaInserirProcesso(actionEvent);
            }
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluirEmpreendimento(ActionEvent actionEvent) {
        msg = null;
        lReturn = false;
        RequestContext context = RequestContext.getCurrentInstance();

        try {
            empreendimentoJpa.destroy(selectedEmpreendimento);

            selectedEmpreendimentoLote = new EmpreendimentoLote();

            lReturn = true;

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Empreendimento Excluido com Sucesso: ".concat(selectedEmpreendimento.getDscEmpreendimento())), selectedEmpreendimento.getDscEmpreendimento());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Empreendimento não pode ser EXCLUIDO, já contem CARGA no SISTEMA!", selectedEmpreendimento.getDscEmpreendimento());
            lReturn = false;
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            if (lReturn) {
                selectedEmpreendimento = new Empreendimento();
                selectedEmpreendimentoEndereco = new EmpreendimentoEndereco();
                selectedEmpreendimentoEndereco.setCodLogradouro(new CepEndereco());
                selectedEmpreendimentoLote = new EmpreendimentoLote();
                this.selectedEmpreendimentoLote.setTipPrioridadeLote("N");
                this.selectedEmpreendimentoLote.setStatus("A");
                this.selectedEmpreendimentoLote.setTipStatus("T");
                this.selectedEmpreendimentoLote.setTipStatusSinal("A");
                this.selectedEmpreendimentoLote.setIdAssunto(new Assunto());
                context.update("frmEmpreendimento:panel");
                context.update("frmEmpreendimento:empreendimentoTable");
            }
            context.update("frmEmpreendimento:messages");

        }
    }

    public void excluirProcesso(ActionEvent actionEvent) {
        lReturn = false;
        try {
            if (!selectedEmpreendimentoLote.getProcessoList().isEmpty()) {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Processo já contem CARGA! Processo não pode ser EXCLUIDO! ", selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
            } else {
                selectedEmpreendimento.getEmpreendimentoLoteList().remove(selectedEmpreendimentoLote);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Processo Excluido com Sucesso!", selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
                lReturn = true;
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Excluir o Processo: ", selectedEmpreendimentoLote.getIdAssunto().getDscAssunto());
            lReturn = false;
        } finally {
            if (lReturn) {
                selectedEmpreendimentoLote = new EmpreendimentoLote();
                this.selectedEmpreendimentoLote.setTipPrioridadeLote("N");
                this.selectedEmpreendimentoLote.setStatus("A");
                this.selectedEmpreendimentoLote.setTipStatus("T");
                this.selectedEmpreendimentoLote.setTipStatusSinal("A");
                this.selectedEmpreendimentoLote.setIdAssunto(new Assunto());
            }
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public boolean ValidaCampos(String cOperacao) throws IOException {
        lReturn = true;

        if (selectedEmpreendimento.getTipEmpreendimento().isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... OBRIGATÓRIO DEFINIR O TIPO DO EMPREENDIMENTO!");
            lReturn = false;
        } else if (!funcoes.valida_CpfCnpj(selectedEmpreendimento.getNumCpfEmpreendimento())) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... C.N.P.J. ou C.P.F. INCORRETO!");
            lReturn = false;
        } else if (selectedEmpreendimento.getDscEmpreendimento().isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... OBRIGATÓRIO DEFINIR A DESCRIÇÃO DO EMPREENDIMENTO!");
            lReturn = false;
        } else if (selectedEmpreendimento.getIdCliente() == null) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... OBRIGATÓRIO DEFINIR O CLIENTE DO EMPREENDIMENTO!");
            lReturn = false;
        } else if (selectedEmpreendimento.getEmpreendimentoEnderecoList() == null) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... OBRIGATÓRIO DEFINIR O ENDEREÇO DO EMPREENDIMENTO!");
            lReturn = false;
        } else if (selectedEmpreendimento.getEmpreendimentoEnderecoList() == null || selectedEmpreendimento.getEmpreendimentoEnderecoList().isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... OBRIGATÓRIO INCLUIR ENDEREÇO!");
            lReturn = false;
        } else if (!selectedEmpreendimento.getStaEmpreendimento().equals("A")) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... EMPREENDIMENTO INATIVO!");
            lReturn = false;
        } else {
            for (int i = 0; i < selectedEmpreendimento.getEmpreendimentoEnderecoList().size(); i++) {
                if (selectedEmpreendimento.getEmpreendimentoEnderecoList().get(i).getCodLogradouro() == null) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... OBRIGATÓRIO INCLUIR ENDEREÇO!");
                    lReturn = false;
                    break;
                }
            }

            if (lReturn) {
                if (selectedEmpreendimento.getTipPrioridade() == null) {
                    selectedEmpreendimento.setTipPrioridade("N");
                }
                for (int i = 0; i < selectedEmpreendimento.getEmpreendimentoLoteList().size(); i++) {
                    selectedEmpreendimentoLote = new EmpreendimentoLote();
                    this.selectedEmpreendimentoLote.setTipPrioridadeLote("N");
                    this.selectedEmpreendimentoLote.setStatus("A");
                    this.selectedEmpreendimentoLote.setTipStatus("T");
                    this.selectedEmpreendimentoLote.setTipStatusSinal("A");
                    this.selectedEmpreendimentoLote.setIdAssunto(new Assunto());
                    selectedEmpreendimentoLote = selectedEmpreendimento.getEmpreendimentoLoteList().get(i);

                    if (selectedEmpreendimentoLote.getTipPrioridadeLote() == null) {
                        selectedEmpreendimentoLote.setTipPrioridadeLote("N");
                    }
                    if (selectedEmpreendimentoLote.getIdAssunto() == null) {
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... ASSUNTO EM BRANCO!");
                        lReturn = false;
                    } else if (selectedEmpreendimentoLote.getNumProcesso().isEmpty()) {
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... No. PROCESSO EM BRANCO!");
                        lReturn = false;
                    } else if (selectedEmpreendimentoLote.getStatus().isEmpty()) {
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... STATUS EM DO PROCESSO BRANCO!");
                        lReturn = false;
                    } else if (selectedEmpreendimentoLote.getTipPrioridadeLote().isEmpty()) {
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao " + cOperacao + ": " + selectedEmpreendimento.getDscEmpreendimento(), "ATENÇÃO ... PRIORIDADE DO PROCESSO EM BRANCO!");
                        lReturn = false;
                    }
                }
            }
        }
        return lReturn;
    }

    public Integer getRowid() {
        return rowid;
    }

    public void setRowid(Integer rowid) {
        this.rowid = rowid;
    }

    public boolean isEnderecoField() {
        return enderecoField;
    }

    public void setEnderecoField(boolean enderecoField) {
        this.enderecoField = enderecoField;
    }

    public EmpreendimentoEndereco getSelectedEmpreendimentoEndereco() {
        return selectedEmpreendimentoEndereco;
    }

    public void setSelectedEmpreendimentoEndereco(EmpreendimentoEndereco selectedEmpreendimentoEndereco) {
        if (selectedEmpreendimentoEndereco.getCodLogradouro() == null) {
            selectedEmpreendimentoEndereco.setCodLogradouro(new CepEndereco());
        }
        this.selectedEmpreendimentoEndereco = selectedEmpreendimentoEndereco;
    }

    public CepEndereco getSelectedCepEndereco() {
        return selectedCepEndereco;
    }

    public void setSelectedCepEndereco(CepEndereco selectedCepEndereco) {
        this.selectedEmpreendimentoEndereco.setCodLogradouro(selectedCepEndereco);
        this.selectedCepEndereco = selectedCepEndereco;
    }

    public boolean valida_endereco() {
        lReturn = true;

        if (this.selectedEmpreendimentoEndereco.getCodLogradouro() == null) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... OBRIGATÓRIO DEFINIR O C.E.P. DO ENDEREÇO!", null);
            lReturn = false;
        } else if (this.selectedEmpreendimentoEndereco.getNumEndereco().isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... OBRIGATÓRIO DEFINIR O NUMERO DO ENDEREÇO!", null);
            lReturn = false;
        } else if (this.selectedEmpreendimentoEndereco.getNumContribuinte().isEmpty()) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... OBRIGATÓRIO DEFINIR O NUMERO DO CONTRIBUINTE!", null);
            lReturn = false;
        }

        return lReturn;
    }

    public boolean isMostradmin() {
        return mostradmin;
    }

    public void setMostradmin(boolean mostradmin) {
        this.mostradmin = mostradmin;
    }

    public int getRowidclienteempreendimento() {
        return rowidclienteempreendimento;
    }

    public void setRowidclienteempreendimento(int rowidclienteempreendimento) {
        this.rowidclienteempreendimento = rowidclienteempreendimento;
    }

    public void salvarDiagnostico(ActionEvent actionEvent) throws IOException {
        if (this.selectedEmpreendimentoLote.getProcessoDiagnosticoNivel1List() != null) {
            List<ProcessoDiagnosticoNivel1> ProcessoDiagnosticoNivel1List = new ArrayList<>();

            for (int i = 0; i < this.selectedEmpreendimentoLote.getProcessoDiagnosticoNivel1List().size(); i++) {
                this.selectedProcessoDiagnosticoNivel1 = this.selectedEmpreendimentoLote.getProcessoDiagnosticoNivel1List().get(i);

                this.selectedProcessoDiagnosticoNivel1.setIdEmpreendimentoLote(selectedEmpreendimentoLote);

                if (!funcoes.TiraNull(this.selectedProcessoDiagnosticoNivel1.getDatAprovacao()).isEmpty()
                        || !funcoes.TiraNull(this.selectedProcessoDiagnosticoNivel1.getDatTerceiroAprovacao()).isEmpty()
                        || !funcoes.TiraNull(this.selectedProcessoDiagnosticoNivel1.getTipAplica()).isEmpty()
                        || !funcoes.TiraNull(this.selectedProcessoDiagnosticoNivel1.getTipContratado()).isEmpty()
                        || !funcoes.TiraNull(this.selectedProcessoDiagnosticoNivel1.getTipTerceiro()).isEmpty()) {

                    ProcessoDiagnosticoNivel1List.add(selectedProcessoDiagnosticoNivel1);
                }
            }
            this.selectedEmpreendimentoLote.setProcessoDiagnosticoNivel1List(ProcessoDiagnosticoNivel1List);
        }
    }

    public void excluirDiagnostico(ActionEvent actionEvent) {
        this.selectedEmpreendimentoLote.setDscDiagnostico("");
        this.selectedEmpreendimentoLote.setProcessoDiagnosticoNivel1List(new ArrayList<ProcessoDiagnosticoNivel1>());
    }

    public Diagnostico getSelectedDiagnostico() {
        return selectedDiagnostico;
    }

    public void setSelectedDiagnostico(Diagnostico selectedDiagnostico) {
        this.selectedEmpreendimentoLote.setDscDiagnostico(selectedDiagnostico.getDscDiagnostico());

        this.selectedEmpreendimentoLote.setProcessoDiagnosticoNivel1List(new ArrayList<ProcessoDiagnosticoNivel1>());

        for (int i = 0; i < selectedDiagnostico.getDiagnosticoNivel1List().size(); i++) {
            selectedProcessoDiagnosticoNivel1 = new ProcessoDiagnosticoNivel1();

            this.selectedProcessoDiagnosticoNivel1.setDscDiagnosticoNivel1(selectedDiagnostico.getDiagnosticoNivel1List().get(i).getDscDiagnosticoNivel1());

            this.selectedEmpreendimentoLote.getProcessoDiagnosticoNivel1List().add(selectedProcessoDiagnosticoNivel1);
        }
        this.selectedDiagnostico = selectedDiagnostico;
    }

    private boolean verifica_processo(String cProcesso) {
        boolean lPassa = true;
        String cSql = "select * from empreendimento_lote where num_processo = '".concat(this.selectedEmpreendimentoLote.getNumProcesso()).concat("' ");
        EmpreendimentoLote selectedEmpreendimentoLoteTemp = null;

        try {
            selectedEmpreendimentoLoteTemp = empreendimentoLoteJpa.getNativeFiltro(cSql);
            if (selectedEmpreendimentoLoteTemp != null) {
                if (cProcesso.equals("I")) {
                    lPassa = false;
                } else {
                    if (this.selectedEmpreendimentoLote.getIdEmpreendimentoLote() == selectedEmpreendimentoLoteTemp.getIdEmpreendimentoLote()) {
                        lPassa = false;
                    }
                }
            }
        } catch (EaoException ex) {
            lPassa = true;
        }

        return lPassa;
    }

    public boolean isIncluir() {
        return incluir;
    }

    public void setIncluir(boolean incluir) {
        this.incluir = incluir;
    }

    public int getRowidEndereco() {
        return rowidEndereco;
    }

    public void setRowidEndereco(int rowidEndereco) {
        this.rowidEndereco = rowidEndereco;
    }

    public boolean isIncluirprocesso() {
        return incluirprocesso;
    }

    public void setIncluirprocesso(boolean incluirprocesso) {
        this.incluirprocesso = incluirprocesso;
    }

    public EmpreendimentoLote[] getEmpreendimentoLoteTransferencia() {
        return empreendimentoLoteTransferencia;
    }

    public void setEmpreendimentoLoteTransferencia(EmpreendimentoLote[] empreendimentoLoteTransferencia) {
        this.empreendimentoLoteTransferencia = empreendimentoLoteTransferencia;
    }

    public Empreendimento getEmpreendimentoTransferencia() {
        return empreendimentoTransferencia;
    }

    public void setEmpreendimentoTransferencia(Empreendimento empreendimentoTransferencia) {
        this.empreendimentoTransferencia = empreendimentoTransferencia;
    }

    public LazySelectedEmpreendimentoLote getLazyEmpreendimentoLoteTransferencia() {
        return lazyEmpreendimentoLoteTransferencia;
    }

    public void setLazyEmpreendimentoLoteTransferencia(LazySelectedEmpreendimentoLote lazyEmpreendimentoLoteTransferencia) {
        this.lazyEmpreendimentoLoteTransferencia = lazyEmpreendimentoLoteTransferencia;
    }

    public LazySelectedEmpreendimento getLazyEmpreendimentoTransferencia() {
        return lazyEmpreendimentoTransferencia;
    }

    public void setLazyEmpreendimentoTransferencia(LazySelectedEmpreendimento lazyEmpreendimentoTransferencia) {
        this.lazyEmpreendimentoTransferencia = lazyEmpreendimentoTransferencia;
    }

}
